﻿using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel;
using System.Collections;

namespace estudent.Models
{
    /// <summary>
    /// Vrne 2D tabelo oblike [vrsta študije, id]
    /// </summary>
    public class PrehodnostSkladisce
    {
        estudentEnt db = new estudentEnt();

        /// <summary>
        /// *DONE*
        /// Query za vse smeri, ki jih fakulteta izvaja 
        /// </summary>
        /// <returns>string[ime smeri, id]</returns>
        public List<SelectListItem> getSeznamSmeriStudija(string nacin)
        {
            var smeri = db.SSmeris.OrderBy(p => p.imeSmer);

            int stVrst = smeri.ToList().Count();

            string[,] sa2 = new string[stVrst, 2];

            int i = 0;

            foreach (var s in smeri)
            {
                string id = s.sSmer;
                string vrsta = s.imeSmer;

                    sa2[i, 0] = vrsta;
                    sa2[i, 1] = id;
                    i++;
            }


            //preverimo, katere smeri so pravzaprav sploh vpisane v bazi vpisov
            LinkedList<string> vpisill = new LinkedList<string>();
            bool redni = true;

            if (nacin.Equals("false"))
                redni = false;



            for(i = 0; i < sa2.GetLength(0); i++)
            {
                string id = sa2[i,1];

                var imaVpisV = db.Vpisis.Where(p => p.sSmer == id && p.redni == redni).Select(p => p.letoVpisa);
                int stVpisov = imaVpisV.ToList().Count();

                if(stVpisov > 0)
                    vpisill.AddLast(id);
            }

            string[,] sa = new string[vpisill.Count(), 2];


            int j = 0;
            for(i = 0; i < sa2.GetLength(0); i++)
            {
                string id = sa2[i,1];

                if(vpisill.Contains(id))
                {
                    sa[j,0] = sa2[i,0];
                    sa[j,1] = sa2[i,1];
                    j++;
                }
            }

            List<SelectListItem> seznamSmeri = new List<SelectListItem>();

            for (i = 0; i < sa.GetLength(0); i++)
                seznamSmeri.Add(new SelectListItem { Text = sa[i, 0], Value = sa[i, 1] });
            return seznamSmeri;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="smerID"></param>
        /// <param name="nacinStudija"></param>
        /// <returns>Seznam let, ko se je določen program izvajal</returns>
        public List<SelectListItem> getSeznamSolskihLet(string smerID, string nacinStudija)
        {
            bool nacinStudijaB = true;

            if (nacinStudija.Equals("false"))
                nacinStudijaB = false;

            var leta = db.Vpisis.Where(p => p.sSmer == smerID && p.redni == nacinStudijaB).OrderBy(p => p.letoVpisa).Select(p => p.letoVpisa);

            LinkedList<string> letaLL = new LinkedList<string>();
            List<SelectListItem> sleta = new List<SelectListItem>();

            foreach (var l in leta)
            {
                DateTime dt = l;
                string leto = dt.Year.ToString();

                if (!letaLL.Contains(leto))
                    letaLL.AddLast(leto);
            }

            for (int i = 0; i < letaLL.Count; i++)
                sleta.Add(new SelectListItem { Text = letaLL.ElementAt(i) + "/" + (Convert.ToInt16(letaLL.ElementAt(i)) + 1).ToString().Substring(2, 2), Value = letaLL.ElementAt(i) + "/" + (Convert.ToInt16(letaLL.ElementAt(i)) + 1).ToString().Substring(2, 2) });

            return sleta;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sa"></param>
        /// <returns>seznam letnikov izbranega študijskega programa, ki so se izvajali v izbranem letu na izbrani način</returns>
        public List<SelectListItem> getSeznamLetnikov(string[] sa)
        {
            string redni = sa[0];
            string smer = sa[1];
            string leto = sa[2].Substring(0, 4);

            int letoInt = Convert.ToInt16(leto);

            DateTime letoVpisa = new DateTime(letoInt, 10, 1);

            bool redniB = true;

            if (redni.Equals("false"))
                redniB = false;

            var letniki = db.Vpisis.Where(p => p.sSmer == smer && p.redni == redniB && p.letoVpisa == letoVpisa).Distinct().Select(p => p.idLetnikStudija);

            LinkedList<string> letnikiLL = new LinkedList<string>();
            List<SelectListItem> sletniki = new List<SelectListItem>();

            foreach (var le in letniki)
            {
                string l = le.ToString();

                if (!letnikiLL.Contains(l))
                    letnikiLL.AddLast(l);
            }

            for (int i = 0; i < letnikiLL.Count; i++)
                sletniki.Add(new SelectListItem { Text = letnikiLL.ElementAt(i).ToString() + ".", Value = letnikiLL.ElementAt(i).ToString() });

            return sletniki;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns>[id smeri, ime smeri]</returns>
        public string[,] sifrant()
        {
            var smeriIDs = db.SSmeris;

            string[,] sifrant = new string[smeriIDs.ToList().Count(), 2];

            int i = 0;

            foreach (var s in smeriIDs)
            {
                sifrant[i, 0] = s.sSmer;
                sifrant[i, 1] = s.imeSmer;
                i++;
            }
            return sifrant;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sa"></param>
        /// <returns>[št. vpisanih v izbrani letnik, število ponovnih vpisov v naslednjem letu, število nevpisanih, število napredovanih]</returns>
        public string[,] Analiza(string[] sa)
        {
            #region init
            string redni = sa[0];
            string smer = sa[1];
            string leto = sa[2].Substring(0, 4);
            string letniks = sa[3].Substring(0, 1);

            int letoInt = Convert.ToInt16(leto);
            int letnik = Convert.ToInt16(letniks);
            int naslednjiLetnik = letnik + 1;

            DateTime letoVpisa = new DateTime(letoInt, 10, 1);

            bool redniB = true;

            if (redni.Equals("false"))
                redniB = false;

            // povecamo na naslednje leto
            int naslednjeLetoInt = letoInt + 1;
            DateTime naslednjeLeto = new DateTime(naslednjeLetoInt, 10, 1);
            #endregion

            #region vsi vpisi
            var vsiVpisiV = db.Vpisis.Where(p => p.sSmer == smer && p.redni == redniB && p.letoVpisa == letoVpisa && p.idLetnikStudija == letnik).Select(p => p.idVpisa);

            int vsiVpisi = vsiVpisiV.ToList().Count();
            #endregion

            #region ponovni vpisi
            var ponovniVpisV = db.Vpisis.Where(p => p.sSmer == smer && p.redni == redniB && p.letoVpisa == naslednjeLeto && p.idLetnikStudija == letnik).Select(p => p.idVpisa);

            int ponovniVpis = ponovniVpisV.ToList().Count();
            #endregion

            #region napredovali
            var napredovaliV = db.Vpisis.Where(p => p.sSmer == smer && p.redni == redniB && p.letoVpisa == naslednjeLeto && p.idLetnikStudija == naslednjiLetnik).Select(p => p.idVpisa);

            int napredovali = ponovniVpisV.ToList().Count();
            #endregion

            #region nevpisani
            int nevpisani = vsiVpisi - ponovniVpis - napredovali;
            #endregion

            #region procenti
            double vsiVpisiP = 100.0;
            double ponovniVpisP = 100.0 * ponovniVpis / vsiVpisi;
            double napredovaliP = 100.0 * napredovali / vsiVpisi;
            double nevpisaniP = 100.0 * nevpisani / vsiVpisi;
            #endregion

            #region fill data table
            string[,] data = new string[4, 2];

            data[0,0] = vsiVpisi.ToString(); data[0,1] = string.Format("{0:N2} %", vsiVpisiP); 
            data[1,0] = ponovniVpis.ToString(); data[1,1] = string.Format("{0:N2} %", ponovniVpisP); 
            data[2,0] = nevpisani.ToString(); data[2,1] = string.Format("{0:N2} %", nevpisaniP); 
            data[3,0] = napredovali.ToString(); data[3,1] = string.Format("{0:N2} %", napredovaliP);
            #endregion

            return data;
        }
    }
}